package com.nhim.cms.admin.server.fileupload;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import com.nhim.cms.admin.shared.Separator;
import com.nhim.core.AppSettings;
import com.nhim.core.io.PathHelper;

import gwtupload.server.UploadAction;
import gwtupload.server.exceptions.UploadActionException;

public class FileUploadServlet extends UploadAction {

	private static final long serialVersionUID = 1L;

	Hashtable<String, String> receivedContentTypes = new Hashtable<String, String>();
	/**
	 * Maintain a list with received files and their content types.
	 */
	Hashtable<String, File> receivedFiles = new Hashtable<String, File>();

	/**
	 * Override executeAction to save the received files in a custom place and
	 * delete this items from session.
	 */
	@Override
	public String executeAction(HttpServletRequest request,
			List<FileItem> sessionFiles) throws UploadActionException {
		String response = "";
		for (FileItem item : sessionFiles) {
			if (false == item.isFormField()) {
				try {
					String[] parts = item.getFieldName().split(Separator.SYSTEM_FILE_UPLOAD_SEPARATOR);				
					if (parts.length >= 3) {

						String filePath = "";
						if (parts[0].equals("1"))
						{
							String templateDirPath = PathHelper.combine(new String[] {
									AppSettings.getInstance()
											.getTemplatesPath(), parts[1] });
							File templateDir = new File(templateDirPath);
							if(!templateDir.exists())
								templateDir.mkdirs();
							filePath = PathHelper.combine(new String[] {templateDir.getPath(),item.getName()});
						}
						File file = new File(filePath);
						if (!file.exists()) {
							if (file.createNewFile()) {
								item.write(file);
								// / Save a list with the received files
								receivedFiles.put(item.getFieldName(), file);
								receivedContentTypes.put(item.getFieldName(),
										item.getContentType());
								// / Send a customized message to the client.
								response = "True";
								return response;
							}
						} else {
							response = "False";
						}
					} else
						response = "False";

				} catch (Exception e) {
					throw new UploadActionException(e);
				}
			}
		}
		// / Remove files from session because we have a copy of them
		removeSessionFileItems(request);
		// / Send your customized message to the client.
		return response;
	}

	/**
	 * Get the content of an uploaded file.
	 */
	@Override
	public void getUploadedFile(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		String fieldName = request.getParameter(PARAM_SHOW);
		File f = receivedFiles.get(fieldName);
		if (f != null) {
			response.setContentType(receivedContentTypes.get(fieldName));
			FileInputStream is = new FileInputStream(f);
			copyFromInputStreamToOutputStream(is, response.getOutputStream());
		} else {
			renderXmlResponse(request, response, ERROR_ITEM_NOT_FOUND);
		}
	}

	/**
	 * Remove a file when the user sends a delete request.
	 */
	@Override
	public void removeItem(HttpServletRequest request, String fieldName)
			throws UploadActionException {
		File file = receivedFiles.get(fieldName);
		receivedFiles.remove(fieldName);
		receivedContentTypes.remove(fieldName);
		if (file != null) {
			file.delete();
		}
	}
}